package cac.fenjian.resource.replacementaosorties.service;

import cac.fenjian.resource.replacementaosorties.dao.ReplacementAoSortiesDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;

@Slf4j
@Service
public class ReplacementAoSortiesService {
    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;
    @Autowired
    private ReplacementAoSortiesDao replacementAoSortiesDao;

    /****
     * 替换架次思路，比如将  A，B两个架次数据互换，比如将A替换为B,则需要将B的数据换成A，需要操作的表主要为ms_ao_match_info表以及assgin表
     *  先将A的相关数据ID替换为B的ID，用一个扩展字段标识哪些是替换的数据
     *  在A的数据替换完后，现在为B的数据有两份，一份是A替换过来的，一份是原来B的数据，需要将原来B的数据替换为A
     *  则将原来为B的数据通过id+扩展字段组合来找到，将原来B的数据更改为A
     *  最后更新扩展字段为空
     * */
    public HashMap aoStartPlaneNo(HashMap sourceAoMap,String replaceStartPlaneNo){
        HashMap retMap = new HashMap();
        String aoCode = (String)sourceAoMap.get("aoCode");
        List<HashMap> replaceAos = replacementAoSortiesDao.searchData(aoCode, replaceStartPlaneNo);
        TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
        try{
            if(replaceAos.size()>0){
                String replaceMsTaskAoId = (String)replaceAos.get(0).get("targetMsTaskAoId");
                String msTaskAoId = (String)sourceAoMap.get("msTaskAoId");
                String orignPlaneNo = (String)sourceAoMap.get("startPlaneNo");//替换前的架次,replaceStartPlaneNo为替换后的架次
                //1：更新matchinfo表数据--将替换A架次的数据全部更新为B架次
                replacementAoSortiesDao.updateInfoData(replaceMsTaskAoId,msTaskAoId,replaceStartPlaneNo);
                //2：更新assgin表数据--将替换A架次的数据全部更新为B架次
                replacementAoSortiesDao.updateAssginData(replaceMsTaskAoId,msTaskAoId,replaceStartPlaneNo);
                //3：将被替换的数据更新，及那个原来B架次的数据更新为A架次
                replacementAoSortiesDao.updateOrignAoMatchInfo(replaceMsTaskAoId,msTaskAoId,orignPlaneNo);
                //4:更新assgin表数据 将被替换的数据更新，及那个原来B架次的数据更新为A架次
                replacementAoSortiesDao.updateOrignAssginData(replaceMsTaskAoId,msTaskAoId,orignPlaneNo);
                //将matchinfo扩展字段还原回去
                replacementAoSortiesDao.updateMatchInfoKzNull(replaceMsTaskAoId,msTaskAoId);
                //将assgin表扩展占用字段还原回去
                replacementAoSortiesDao.updateAssginKzNull(replaceMsTaskAoId,msTaskAoId);
                platformTransactionManager.commit(transaction);
                retMap.put("retCode", "200");
                retMap.put("message", "架次修改成功！");
            }else{
                platformTransactionManager.rollback(transaction);
                retMap.put("retCode", "201");
                retMap.put("message", "修改失败");
            }
        }catch (Exception e){
            e.printStackTrace();
            platformTransactionManager.rollback(transaction);
            retMap.put("retCode", "201");
            retMap.put("message", "修改失败");
        }

        return retMap;
    }

}
